Virtual Functions |
The figure below shows a typical class diagram. The base class must be as generic as possible so that it can be reused. As one class is derived from another one, the derived class is a specialization of the based class and it is more specific. A virtual function is a member function in the base class that has a generic implementation, but in the derived class the function needs to behave differently. In other words, it is possible to provide two implementations (or more) for a virtual function: one implementation in the base class and another implementation in the derived class. La figura de abajo muestra un diagrama de clases típico. La clase base debe ser tan genérica como sea posible de tal forma que esta pueda ser reusada. Como una clase es derivada de otra, la clase derivada es una especialización de la clase base y es más específica. Una función virtual es una función miembro en la clase base que tiene una implementación genérica, pero en la clase derivada la función tiene que comportarse en forma diferente. En otras palabras, es posible proporcionar dos implementaciones (o más) para una función virtual: una implementación en la clase base y otra implementación en la clase derivada. |
Tip |
General Idea: I will move somewhere in the world More Specific: I will move to Europe More Specific: I will move to Germany More Specific: I will move to Berlin More Specific: I will move to Berlin and work at TU Berlin University Idea General: Me voy a vivir a otro país Más específico: Me voy a vivir a Europa Más específico: Me voy a vivir a Alemania Más específico: Me voy a vivir a Berlin Más específico: Me voy a vivir a Berlin y a trabajar en la universidad de TU Berlin |
Problem 1 |
Some functions in the MyPoint class are not working properly in the My3DPoint class. In this problem, you will fix the GetMin(), GetMax() and GetAverage() functions only. First, declare these functions as virtual in the MyPoint.h file. Second, implement these functions in the My3DPoint class as shown. Algunas funciones en la clase MyPoint no están funcionando apropiadamente en la clase My3DPoint. En este problema, usted arreglará solamente las funciones: GetMin(), GetMax() y GetAverage(). Primero, declare estas funciones como virtuales en el archivo MyPoint.h. Segundo, implemente estas funciones in la case My3DPoint como se muestra. |
MyPoint.h |
#pragma once class MyPoint { public: MyPoint(void); MyPoint(const MyPoint& init); ~MyPoint(void); double x; double y; double GetModule(); double GetAbsModule(); virtual double GetMax(); // VIRTUAL virtual double GetMin(); // VIRTUAL virtual double GetAverage(); // VIRTUAL double GetStd(); MyPoint& operator=(const MyPoint& init); MyPoint operator+(const MyPoint& point); MyPoint operator-(const MyPoint& point); MyPoint operator--(); MyPoint operator--(int not_used); MyPoint operator++(); MyPoint operator++(int not_used); bool operator==(const MyPoint& point); bool operator!=(const MyPoint& point); bool operator<(const MyPoint& point); bool operator>(const MyPoint& point); private: void Copy(const MyPoint& init); }; |
My3DPoint.h |
#pragma once #include "mypoint.h" class My3DPoint : public MyPoint { public: My3DPoint(void); ~My3DPoint(void); double z; double GetMax(); double GetMin(); double GetAverage(); }; |
Space.cpp |
... void Space::Window_Open(Win::Event& e) { My3DPoint a; a.x = 10.0; a.y = 12.0; a.z = -10.0; wstring text; Sys::Format(text, L"Minimum = %g\r\n", a.GetMin()); tbxOutput.Text += text; // Sys::Format(text, L"Maximum = %g\r\n", a.GetMax()); tbxOutput.Text += text; // Sys::Format(text, L"Average = %g\r\n", a.GetAverage()); tbxOutput.Text += text; MyPoint b; b.x = 11.5; b.y = -5.5; Sys::Format(text, L"Minimum = %g\r\n", b.GetMin()); tbxOutput.Text += text; } |
Tip |
Inheritance allows creating a class from a previously created class. The base class is not modified for the creation of the new class. The derived class has the same properties and functions of the base class plus some specific properties and functions. Additionally, the derived class may replace some of the functions of the base class. In the previous example, the variable z is added in the MyPoint3D class, and the GetMin function is modified so that it can take into account the value of z. This way, it is possible to write compact code instead of duplicating code in both classes. La herencia permite crear una clase de una clase previamente creada. La clase base no se altera por la creación de la nueva clase. La clase derivada tiene las mismas propiedades y funciones de la clase base mas algunas propiedades y funciones específicas. Adicionalmente, la clase derivada puede reemplazar algunas de las funciones de la clase base. En el ejemplo previo la variable z se agrega a la clase MyPoint3D y la función GetMin se modifica para que pueda tomar el cuenta el valor de z. De esta forma, es posible escribir código compacto en lugar de duplicar el código en ambas clases. |
Tip |
Advantages of inheritance and virtual functions:
Ventajas de la herencia y las funciones virtuales:
|
Problem 2 |
Create a complete project that illustrates how to use virtual functions, you must design at least two classes. Cree un proyecto completo que ilustre como usar las funciones virtuales, usted debe diseñar al menos dos clases. |